package ar.com.logic.components.strategy;

import java.util.List;
import java.util.Random;
import java.util.Vector;

import ar.com.logic.components.CoordenadasFijos;
import ar.com.logic.components.Numero;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
import ar.com.logic.evaluador.Respuesta;

public class EstrategiaFuerzaBruta implements IEstrategia {
	private IMatrizPosiciones matriz;
	private IHistoricoRespuestas historicoRespuestas;

	public EstrategiaFuerzaBruta(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {
		this.matriz = matriz;
		this.historicoRespuestas = historico;
	}

	public Numero getSiguienteNumero() {
		CoordenadasFijos fijos = matriz.obtenerFijos();
		Numero n = new Numero();

		boolean repetido = true;
		Respuesta r = new Respuesta();
		Integer d = 0;
		while (repetido) {
			n = new Numero();
			for (int i = 1; i <= matriz.getMaxPosiciones(); i++) {
				if (fijos.tieneFijoEnPosicion(i)) {
					n.agregarDigito(fijos.getFijoPosicion(i));
				} else {
					d = generarNumeroRandom(n,
							matriz.valoresDisponiblesParaPosicion(i));
					n.agregarDigito(d);
					System.out.println("valor: " + d + " posicion: " + i);
					

				}
			}
			r.setNumero(n);
			repetido = historicoRespuestas.contains(r);
			

		}
		return n;

	}

	private Integer generarNumeroRandom(Numero n, List<Integer> disponibles) {

		Random rand = new Random();

		Integer d = -1;

		if (n.getNumero().size() == 0) {
			d = disponibles.get(rand.nextInt(disponibles.size()));

		} else {

			
			for (Integer integer : disponibles) {
				if(!n.contiene(integer)){
					d = integer;
					break;
				}
				
			}
			if(d == -1){
				
				for (Integer integer : matriz.obtenerDescartados()) {
					if(!n.contiene(integer)){
						d = integer;
						break;
					}
				}
				if(d == -1){
					for (int i = 0; i <matriz.getMaxDigitos(); i++) {
						if(!n.contiene(i)){
							d = i;
							break;
						}
					}
				}
			}
		}
		return d;

	}

	public String getNombre() {

		return IEstrategia.FUERZA_BRUTA;
	}

	public List<Respuesta> getRespuestasEsperadas() {
		// TODO Auto-generated method stub
		return new Vector<Respuesta>();
	}

	public void actualizarPorRespuestaEsperada(Respuesta r) {
		// TODO Auto-generated method stub
		
	}

	public boolean esCondicionEsperada(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {
		// TODO Auto-generated method stub
		return false;
	}

	public boolean esUnicaEjecucion() {
		// TODO Auto-generated method stub
		return false;
	}

	public Integer getPriority() {
		// TODO Auto-generated method stub
		return 1;
	}

	public boolean estaDescartada() {
		// TODO Auto-generated method stub
		return false;
	}

}
